Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / build-logic / flatpak / src / main / kotlin / org / meshtastic / flatpak / GenerateFlatpakSourcesTask.kt

Displaying Raw • Download

build-logic/flatpak/src/main/kotlin/org/meshtastic/flatpak/GenerateFlatpakSourcesTask.kt 6a53022a50fb0c151b61c92bc2ddee4ade287d54 (6a53022a) Text, 12.31 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.flatpak

Tff7b72import T7ee787groovy.json.JsonOutput
Tff7b72import T7ee787org.gradle.api.DefaultTask
Tff7b72import T7ee787org.gradle.api.file.DirectoryProperty
Tff7b72import T7ee787org.gradle.api.file.RegularFileProperty
Tff7b72import T7ee787org.gradle.api.provider.Property
Tff7b72import T7ee787org.gradle.work.DisableCachingByDefault
Tff7b72import T7ee787org.gradle.api.tasks.Input
Tff7b72import T7ee787org.gradle.api.tasks.InputDirectory
Tff7b72import T7ee787org.gradle.api.tasks.OutputFile
Tff7b72import T7ee787org.gradle.api.tasks.PathSensitive
Tff7b72import T7ee787org.gradle.api.tasks.PathSensitivity
Tff7b72import T7ee787org.gradle.api.tasks.TaskAction
Tff7b72import T7ee787org.w3c.dom.Element
Tff7b72import T7ee787org.w3c.dom.NodeList
Tff7b72import T7ee787java.io.File
Tff7b72import T7ee787java.net.URI
Tff7b72import T7ee787java.security.MessageDigest
Tff7b72import T7ee787javax.xml.parsers.DocumentBuilderFactory

T8b949e/** Generates a complete flatpak-sources.json manifest from the local Gradle cache directory. */
Tf0883e@DisableCachingByDefaultTb4b4b4(Te6edf3because Tff7b72= Ta5d6ff"Ta5d6ffResolves remote snapshot metadata that may change between runsTa5d6ff"Tb4b4b4)
Tff7b72abstract Tff7b72class T56d364GenerateFlatpakSourcesTask Tb4b4b4: Te6edf3DefaultTaskTb4b4b4(Tb4b4b4) Tb4b4b4{

Tf0883e@getTb4b4b4:Te6edf3InputDirectory
Tf0883e@getTb4b4b4:Te6edf3PathSensitiveTb4b4b4(Te6edf3PathSensitivityTb4b4b4.Te6edf3RELATIVETb4b4b4)
Tff7b72abstract Tff7b72val Te6edf3cacheDirTb4b4b4: Te6edf3DirectoryProperty

Tf0883e@getTb4b4b4:Te6edf3OutputFile Tff7b72abstract Tff7b72val Te6edf3outputFileTb4b4b4: Te6edf3RegularFileProperty

T8b949e/** Base URL of the Maven snapshot repository (no trailing slash). */
Tf0883e@getTb4b4b4:Te6edf3Input
Tff7b72abstract Tff7b72val Te6edf3snapshotRepoUrlTb4b4b4: Te6edf3PropertyTff7b72<Tffa657StringTff7b72>

Tff7b72init Tb4b4b4{
Te6edf3group Tff7b72= Ta5d6ff"Ta5d6ffflatpakTa5d6ff"
Te6edf3description Tff7b72= Ta5d6ff"Ta5d6ffGenerates a complete flatpak-sources.json manifest from the local Gradle cache directory.Ta5d6ff"
Te6edf3outputsTb4b4b4.Te6edf3upToDateWhen Tb4b4b4{ Tff7b72false Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72data Tff7b72class T56d364SnapshotVersionTb4b4b4(Tff7b72val Te6edf3extensionTb4b4b4: Tffa657StringTb4b4b4, Tff7b72val Te6edf3classifierTb4b4b4: Tffa657String?Tb4b4b4, Tff7b72val Te6edf3valueTb4b4b4: Tffa657StringTb4b4b4)

Tff7b72private Tff7b72data Tff7b72class T56d364SnapshotMetadataTb4b4b4(Tff7b72val Te6edf3snapshotVersionsTb4b4b4: Te6edf3ListTff7b72<Te6edf3SnapshotVersionTff7b72>Tb4b4b4, Tff7b72val Te6edf3fallbackValueTb4b4b4: Tffa657String?Tb4b4b4)

Tff7b72private Tff7b72data Tff7b72class T56d364FlatpakSourceCandidateTb4b4b4(
Tff7b72val Te6edf3fileTb4b4b4: Te6edf3FileTb4b4b4,
Tff7b72val Te6edf3groupTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3versionTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3extTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3destTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3destFilenameTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3primaryUrlTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3mirrorUrlsTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3remoteMetadataCache Tff7b72= Te6edf3mutableMapOfTff7b72<Tffa657StringTb4b4b4, Te6edf3SnapshotMetadata?Tff7b72>Tb4b4b4(Tb4b4b4)

Tf0883e@TaskAction
Tff7b72fun Td2a8ffgenerateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3cacheFolder Tff7b72= Te6edf3cacheDirTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3asFile

Tff7b72val Te6edf3outputSourcesFile Tff7b72= Te6edf3outputFileTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3asFile
Tff7b72val Te6edf3snapshotBase Tff7b72= Te6edf3snapshotRepoUrlTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)
Te6edf3loggerTb4b4b4.Te6edf3lifecycleTb4b4b4(Ta5d6ff"Ta5d6ffScanning Gradle cache directory: Tffd700${Te6edf3cacheFolderTb4b4b4.Te6edf3absolutePathTffd700}Ta5d6ff"Tb4b4b4)

Tff7b72val Te6edf3allowedExtensions Tff7b72= Te6edf3setOfTb4b4b4(Ta5d6ff"Ta5d6ffjarTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffaarTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpomTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmoduleTa5d6ff"Tb4b4b4)

T8b949e// Scan the cache using a clean functional sequence pipeline
Tff7b72val Te6edf3candidates Tff7b72=
Te6edf3cacheFolder
Tb4b4b4.Te6edf3walkTopDownTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isFile Tb4b4b4}
Tb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3extensionTb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4) Tff7b72in Te6edf3allowedExtensions Tb4b4b4}
Tb4b4b4.Te6edf3filterNot Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff"Ta5d6ff-sources.jarTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72| Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff"Ta5d6ff-javadoc.jarTa5d6ff"Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3file Tff7b72-Tff7b72>
Tff7b72val Te6edf3ext Tff7b72= Te6edf3fileTb4b4b4.Te6edf3extensionTb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3filename Tff7b72= Te6edf3fileTb4b4b4.Te6edf3name
Tff7b72val Te6edf3relativePath Tff7b72= Te6edf3fileTb4b4b4.Te6edf3relativeToTb4b4b4(Te6edf3cacheFolderTb4b4b4)Tb4b4b4.Te6edf3pathTb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff'\\'Tb4b4b4, Ta5d6ff'/'Tb4b4b4)
Tff7b72val Te6edf3parts Tff7b72= Te6edf3relativePathTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff'/'Tb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3partsTb4b4b4.Te6edf3size Tff7b72!Tff7b72= T79c0ff5Tb4b4b4) Tff7b72returnTf0883e@mapNotNull Tff7b72null

Tff7b72val Tb4b4b4(Te6edf3groupTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3versionTb4b4b4) Tff7b72= Te6edf3parts
Tff7b72val Te6edf3groupPath Tff7b72= Te6edf3groupTb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff'.'Tb4b4b4, Ta5d6ff'/'Tb4b4b4)
Tff7b72val Te6edf3standardPrefix Tff7b72= Ta5d6ff"Tffd700$Te6edf3nameTa5d6ff-Tffd700$Te6edf3versionTa5d6ff"
Tff7b72val Te6edf3isSnapshot Tff7b72= Te6edf3versionTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff"Ta5d6ff-SNAPSHOTTa5d6ff"Tb4b4b4)

Tff7b72val Te6edf3resolvedVersion Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3isSnapshotTb4b4b4) Tb4b4b4{
Te6edf3resolveSnapshotVersionTb4b4b4(Te6edf3snapshotBaseTb4b4b4, Te6edf3groupPathTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3versionTb4b4b4, Te6edf3extTb4b4b4) Tff7b72?: Te6edf3version
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3version
Tb4b4b4}

Tff7b72val Te6edf3serverFilename Tff7b72=
Tff7b72when Tb4b4b4{
Te6edf3isSnapshot Tff7b72-Tff7b72> Ta5d6ff"Tffd700$Te6edf3nameTa5d6ff-Tffd700$Te6edf3resolvedVersionTa5d6ff.Tffd700$Te6edf3extTa5d6ff"
Te6edf3filenameTb4b4b4.Te6edf3startsWithTb4b4b4(Te6edf3standardPrefixTb4b4b4) Tff7b72-Tff7b72> Te6edf3filename
Tff7b72else Tff7b72-Tff7b72> Ta5d6ff"Tffd700$Te6edf3nameTa5d6ff-Tffd700$Te6edf3versionTa5d6ff.Tffd700$Te6edf3extTa5d6ff"
Tb4b4b4}

Tff7b72val Te6edf3mavenPath Tff7b72= Ta5d6ff"Tffd700$Te6edf3groupPathTa5d6ff/Tffd700$Te6edf3nameTa5d6ff/Tffd700$Te6edf3versionTa5d6ff/Tffd700$Te6edf3serverFilenameTa5d6ff"
Tff7b72val Te6edf3dest Tff7b72= Ta5d6ff"Ta5d6ffoffline-repository/Tffd700$Te6edf3groupPathTa5d6ff/Tffd700$Te6edf3nameTa5d6ff/Tffd700$Te6edf3versionTa5d6ff"

Tff7b72val Te6edf3isJitpack Tff7b72= Te6edf3groupTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ffcom.github.Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3primaryUrl Tff7b72=
Tff7b72when Tb4b4b4{
Te6edf3isSnapshot Tff7b72-Tff7b72>
Ta5d6ff"Tffd700$Te6edf3snapshotBaseTa5d6ff/Tffd700$Te6edf3mavenPathTa5d6ff"

Te6edf3isJitpack Tff7b72-Tff7b72>
Ta5d6ff"Ta5d6ffhttps://jitpack.io/Tffd700$Te6edf3mavenPathTa5d6ff"

Tff7b72else Tff7b72-Tff7b72>
Ta5d6ff"Ta5d6ffhttps://repo.maven.apache.org/maven2/Tffd700$Te6edf3mavenPathTa5d6ff"
Tb4b4b4}

Tff7b72val Te6edf3mirrorUrls Tff7b72=
Tff7b72when Tb4b4b4{
Te6edf3isSnapshot Tff7b72-Tff7b72> Te6edf3listOfTb4b4b4(
Ta5d6ff"Ta5d6ffhttps://s01.oss.sonatype.org/content/repositories/snapshots/Tffd700$Te6edf3mavenPathTa5d6ff"Tb4b4b4,
Tb4b4b4)

Te6edf3isJitpack Tff7b72-Tff7b72> Te6edf3emptyListTb4b4b4(Tb4b4b4)

Tff7b72else Tff7b72-Tff7b72>
Te6edf3listOfTb4b4b4(
Ta5d6ff"Ta5d6ffhttps://dl.google.com/dl/android/maven2/Tffd700$Te6edf3mavenPathTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffhttps://plugins.gradle.org/m2/Tffd700$Te6edf3mavenPathTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffhttps://maven-central.storage-download.googleapis.com/maven2/Tffd700$Te6edf3mavenPathTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3FlatpakSourceCandidateTb4b4b4(
Te6edf3file Tff7b72= Te6edf3fileTb4b4b4,
Te6edf3group Tff7b72= Te6edf3groupTb4b4b4,
Te6edf3name Tff7b72= Te6edf3nameTb4b4b4,
Te6edf3version Tff7b72= Te6edf3versionTb4b4b4,
Te6edf3ext Tff7b72= Te6edf3extTb4b4b4,
Te6edf3dest Tff7b72= Te6edf3destTb4b4b4,
Te6edf3destFilename Tff7b72= Te6edf3filenameTb4b4b4,
Te6edf3primaryUrl Tff7b72= Te6edf3primaryUrlTb4b4b4,
Te6edf3mirrorUrls Tff7b72= Te6edf3mirrorUrlsTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)

T8b949e// Deduplicate and sort by unique destination path + file
Tff7b72val Te6edf3deduplicated Tff7b72=
Te6edf3candidates
Tb4b4b4.Te6edf3groupBy Tb4b4b4{ Ta5d6ff"Tffd700${Tffa657itTb4b4b4.Te6edf3destTffd700}Ta5d6ff/Tffd700${Tffa657itTb4b4b4.Te6edf3destFilenameTffd700}Ta5d6ff" Tb4b4b4}
Tb4b4b4.Te6edf3map Tb4b4b4{ Tb4b4b4(Te6edf3_Tb4b4b4, Te6edf3groupCandidatesTb4b4b4) Tff7b72-Tff7b72> Te6edf3groupCandidatesTb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3sortedBy Tb4b4b4{ Ta5d6ff"Tffd700${Tffa657itTb4b4b4.Te6edf3destTffd700}Ta5d6ff/Tffd700${Tffa657itTb4b4b4.Te6edf3destFilenameTffd700}Ta5d6ff" Tb4b4b4}

Te6edf3loggerTb4b4b4.Te6edf3lifecycleTb4b4b4(Ta5d6ff"Ta5d6ffCalculating checksums for Tffd700${Te6edf3deduplicatedTb4b4b4.Te6edf3sizeTffd700}Ta5d6ff unique sources...Ta5d6ff"Tb4b4b4)

Tff7b72val Te6edf3finalEntries Tff7b72=
Te6edf3deduplicatedTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3candidate Tff7b72-Tff7b72>
Tff7b72val Te6edf3entry Tff7b72= Te6edf3mutableMapOfTff7b72<Tffa657StringTb4b4b4, Tffa657AnyTff7b72>Tb4b4b4(
Ta5d6ff"Ta5d6fftypeTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffurlTa5d6ff" Te6edf3to Te6edf3candidateTb4b4b4.Te6edf3primaryUrlTb4b4b4,
Ta5d6ff"Ta5d6ffsha256Ta5d6ff" Te6edf3to Te6edf3calculateSha256Tb4b4b4(Te6edf3candidateTb4b4b4.Te6edf3fileTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdestTa5d6ff" Te6edf3to Te6edf3candidateTb4b4b4.Te6edf3destTb4b4b4,
Ta5d6ff"Ta5d6ffdest-filenameTa5d6ff" Te6edf3to Te6edf3candidateTb4b4b4.Te6edf3destFilenameTb4b4b4,
Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3candidateTb4b4b4.Te6edf3mirrorUrlsTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3entryTff7b72[Ta5d6ff"Ta5d6ffmirror-urlsTa5d6ff"Tff7b72] Tff7b72= Te6edf3candidateTb4b4b4.Te6edf3mirrorUrls
Tb4b4b4}
Te6edf3entry
Tb4b4b4}

Te6edf3outputSourcesFileTb4b4b4.Te6edf3writeTextTb4b4b4(Te6edf3JsonOutputTb4b4b4.Te6edf3prettyPrintTb4b4b4(Te6edf3JsonOutputTb4b4b4.Te6edf3toJsonTb4b4b4(Te6edf3finalEntriesTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3loggerTb4b4b4.Te6edf3lifecycleTb4b4b4(
Ta5d6ff"Ta5d6ffSuccessfully scanned cache and generated Tffd700${Te6edf3outputSourcesFileTb4b4b4.Te6edf3nameTffd700}Ta5d6ff containing Tffd700${Te6edf3finalEntriesTb4b4b4.Te6edf3sizeTffd700}Ta5d6ff entries.Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

T8b949e/**
* Resolves the timestamped snapshot version by fetching maven-metadata.xml from the remote
* snapshot repository. Maven snapshot repos do not serve artifacts at the generic `-SNAPSHOT`
* filename — they require the unique timestamped coordinate (e.g. `0.2.4-20260520.043744-2`).
*/
Tff7b72private Tff7b72fun Td2a8ffresolveSnapshotVersionTb4b4b4(
Te6edf3snapshotBaseTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3groupPathTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3artifactIdTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3versionTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3extensionTb4b4b4: Tffa657StringTb4b4b4,
Tb4b4b4)Tb4b4b4: Tffa657String? Tb4b4b4{
Tff7b72val Te6edf3cacheKey Tff7b72= Ta5d6ff"Tffd700$Te6edf3groupPathTa5d6ff:Tffd700$Te6edf3artifactIdTa5d6ff:Tffd700$Te6edf3versionTa5d6ff"
Tff7b72if Tb4b4b4(Te6edf3cacheKey Tff7b72in Te6edf3remoteMetadataCacheTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3findMatchingVersionTb4b4b4(Te6edf3remoteMetadataCacheTff7b72[Te6edf3cacheKeyTff7b72]Tb4b4b4, Te6edf3extensionTb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3metadataUrl Tff7b72= Ta5d6ff"Tffd700$Te6edf3snapshotBaseTa5d6ff/Tffd700$Te6edf3groupPathTa5d6ff/Tffd700$Te6edf3artifactIdTa5d6ff/Tffd700$Te6edf3versionTa5d6ff/maven-metadata.xmlTa5d6ff"

Tff7b72val Te6edf3metadata Tff7b72= Te6edf3fetchAndParseMetadataTb4b4b4(Te6edf3metadataUrlTb4b4b4)
Te6edf3remoteMetadataCacheTff7b72[Te6edf3cacheKeyTff7b72] Tff7b72= Te6edf3metadata
Tff7b72return Te6edf3findMatchingVersionTb4b4b4(Te6edf3metadataTb4b4b4, Te6edf3extensionTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8fffindMatchingVersionTb4b4b4(Te6edf3metadataTb4b4b4: Te6edf3SnapshotMetadata?Tb4b4b4, Te6edf3extensionTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657String? Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3metadata Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tff7b72return Tff7b72null
Tff7b72return Te6edf3metadataTb4b4b4.Te6edf3snapshotVersions
Tb4b4b4.Te6edf3firstOrNull Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3extension Tff7b72=Tff7b72= Te6edf3extension Tff7b72&Tff7b72& Tffa657itTb4b4b4.Te6edf3classifier Tff7b72=Tff7b72= Tff7b72null Tb4b4b4}
Tff7b72?.Te6edf3value
Tff7b72?: Te6edf3metadataTb4b4b4.Te6edf3fallbackValue
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8fffetchAndParseMetadataTb4b4b4(Te6edf3urlTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3SnapshotMetadata? Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3loggerTb4b4b4.Te6edf3infoTb4b4b4(Ta5d6ff"Ta5d6ffFetching snapshot metadata: Tffd700$Te6edf3urlTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3connection Tff7b72= Te6edf3URITb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4.Te6edf3toURLTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3openConnectionTb4b4b4(Tb4b4b4)
Te6edf3connectionTb4b4b4.Te6edf3connectTimeout Tff7b72= Te6edf3TIMEOUT_MS
Te6edf3connectionTb4b4b4.Te6edf3readTimeout Tff7b72= Te6edf3TIMEOUT_MS

Tff7b72val Te6edf3doc Tff7b72= Te6edf3connectionTb4b4b4.Te6edf3getInputStreamTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3use Tb4b4b4{ Te6edf3stream Tff7b72-Tff7b72>
Tff7b72val Te6edf3dbFactory Tff7b72= Te6edf3DocumentBuilderFactoryTb4b4b4.Te6edf3newInstanceTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3dBuilder Tff7b72= Te6edf3dbFactoryTb4b4b4.Te6edf3newDocumentBuilderTb4b4b4(Tb4b4b4)
Te6edf3dBuilderTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3streamTb4b4b4)
Tb4b4b4}
Te6edf3docTb4b4b4.Te6edf3documentElementTb4b4b4.Te6edf3normalizeTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3root Tff7b72= Te6edf3docTb4b4b4.Te6edf3documentElement
Tff7b72val Te6edf3snapshotVersions Tff7b72= Te6edf3mutableListOfTff7b72<Te6edf3SnapshotVersionTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3rootTb4b4b4.Te6edf3getElementsByTagNameTb4b4b4(Ta5d6ff"Ta5d6ffsnapshotVersionTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3forEachElement Tb4b4b4{ Te6edf3element Tff7b72-Tff7b72>
Tff7b72val Te6edf3ext Tff7b72= Te6edf3elementTb4b4b4.Te6edf3getChildTextTb4b4b4(Ta5d6ff"Ta5d6ffextensionTa5d6ff"Tb4b4b4) Tff7b72?: Tff7b72returnTf0883e@forEachElement
Tff7b72val Te6edf3value Tff7b72= Te6edf3elementTb4b4b4.Te6edf3getChildTextTb4b4b4(Ta5d6ff"Ta5d6ffvalueTa5d6ff"Tb4b4b4) Tff7b72?: Tff7b72returnTf0883e@forEachElement
Tff7b72val Te6edf3classif Tff7b72= Te6edf3elementTb4b4b4.Te6edf3getChildTextTb4b4b4(Ta5d6ff"Ta5d6ffclassifierTa5d6ff"Tb4b4b4)
Te6edf3snapshotVersionsTb4b4b4.Te6edf3addTb4b4b4(Te6edf3SnapshotVersionTb4b4b4(Te6edf3extTb4b4b4, Te6edf3classifTb4b4b4, Te6edf3valueTb4b4b4)Tb4b4b4)
Tb4b4b4}

Tff7b72var Te6edf3fallbackValueTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72val Te6edf3snapshotNode Tff7b72= Te6edf3rootTb4b4b4.Te6edf3getElementsByTagNameTb4b4b4(Ta5d6ff"Ta5d6ffsnapshotTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3itemTb4b4b4(T79c0ff0Tb4b4b4) Tff7b72as? Te6edf3Element
Tff7b72if Tb4b4b4(Te6edf3snapshotNode Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3timestamp Tff7b72= Te6edf3snapshotNodeTb4b4b4.Te6edf3getChildTextTb4b4b4(Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3buildNumber Tff7b72= Te6edf3snapshotNodeTb4b4b4.Te6edf3getChildTextTb4b4b4(Ta5d6ff"Ta5d6ffbuildNumberTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3metaVersion Tff7b72= Te6edf3rootTb4b4b4.Te6edf3getChildTextTb4b4b4(Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3timestamp Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3buildNumber Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3metaVersion Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3baseVersion Tff7b72= Te6edf3metaVersionTb4b4b4.Te6edf3substringBeforeTb4b4b4(Ta5d6ff"Ta5d6ff-SNAPSHOTTa5d6ff"Tb4b4b4)
Te6edf3fallbackValue Tff7b72= Ta5d6ff"Tffd700$Te6edf3baseVersionTa5d6ff-Tffd700$Te6edf3timestampTa5d6ff-Tffd700$Te6edf3buildNumberTa5d6ff"
Tb4b4b4}
Tb4b4b4}

Tff7b72return Te6edf3SnapshotMetadataTb4b4b4(Te6edf3snapshotVersionsTb4b4b4, Te6edf3fallbackValueTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3loggerTb4b4b4.Te6edf3warnTb4b4b4(Ta5d6ff"Ta5d6ffFailed to fetch snapshot metadata from Tffd700$Te6edf3urlTa5d6ff: Tffd700${Te6edf3eTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72return Tff7b72null
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffcalculateSha256Tb4b4b4(Te6edf3fileTb4b4b4: Te6edf3FileTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3digest Tff7b72= Te6edf3MessageDigestTb4b4b4.Te6edf3getInstanceTb4b4b4(Ta5d6ff"Ta5d6ffSHA-256Ta5d6ff"Tb4b4b4)
Te6edf3fileTb4b4b4.Te6edf3inputStreamTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3use Tb4b4b4{ Te6edf3inputStream Tff7b72-Tff7b72>
Tff7b72val Te6edf3buffer Tff7b72= Te6edf3ByteArrayTb4b4b4(T79c0ff8T79c0ff1T79c0ff9T79c0ff2Tb4b4b4)
Tff7b72var Te6edf3bytesRead Tff7b72= Te6edf3inputStreamTb4b4b4.Te6edf3readTb4b4b4(Te6edf3bufferTb4b4b4)
Tff7b72while Tb4b4b4(Te6edf3bytesRead Tff7b72!Tff7b72= Tff7b72-T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3digestTb4b4b4.Te6edf3updateTb4b4b4(Te6edf3bufferTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3bytesReadTb4b4b4)
Te6edf3bytesRead Tff7b72= Te6edf3inputStreamTb4b4b4.Te6edf3readTb4b4b4(Te6edf3bufferTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3bytes Tff7b72= Te6edf3digestTb4b4b4.Te6edf3digestTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3hexDigits Tff7b72= Ta5d6ff"Ta5d6ff0123456789abcdefTa5d6ff"
Tff7b72val Te6edf3hexChars Tff7b72= Te6edf3CharArrayTb4b4b4(Te6edf3bytesTb4b4b4.Te6edf3size Tff7b72* T79c0ff2Tb4b4b4)
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72in Te6edf3bytesTb4b4b4.Te6edf3indicesTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3v Tff7b72= Te6edf3bytesTff7b72[Te6edf3iTff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFF
Te6edf3hexCharsTff7b72[Te6edf3i Tff7b72* T79c0ff2Tff7b72] Tff7b72= Te6edf3hexDigitsTff7b72[Te6edf3v Te6edf3ushr T79c0ff4Tff7b72]
Te6edf3hexCharsTff7b72[Te6edf3i Tff7b72* T79c0ff2 Tff7b72+ T79c0ff1Tff7b72] Tff7b72= Te6edf3hexDigitsTff7b72[Te6edf3v Te6edf3and T79c0ff0Te6edf3x0FTff7b72]
Tb4b4b4}
Tff7b72return Tffa657StringTb4b4b4(Te6edf3hexCharsTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Te6edf3ElementTb4b4b4.Td2a8ffgetChildTextTb4b4b4(Te6edf3tagNameTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657String? Tff7b72= Te6edf3getElementsByTagNameTb4b4b4(Te6edf3tagNameTb4b4b4)Tb4b4b4.Te6edf3itemTb4b4b4(T79c0ff0Tb4b4b4)Tff7b72?.Te6edf3textContent

Tff7b72private Tff7b72fun Te6edf3NodeListTb4b4b4.Td2a8ffforEachElementTb4b4b4(Te6edf3actionTb4b4b4: Tb4b4b4(Te6edf3ElementTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72in T79c0ff0 Te6edf3until Te6edf3lengthTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3node Tff7b72= Te6edf3itemTb4b4b4(Te6edf3iTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3node Tff7b72is Te6edf3ElementTb4b4b4) Tb4b4b4{
Te6edf3actionTb4b4b4(Te6edf3nodeTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72private Tff7b72const Tff7b72val Te6edf3TIMEOUT_MS Tff7b72= T79c0ff1T79c0ff0Te6edf3_000
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.4 - Generated in 0.08s